/*----------------------------------------------------------------------------*\
|
|						Public Interface to Muse Technology
|
|							     www.Muse.com
| Author : SunJun 
| Email : sundoom@msn.com
\*----------------------------------------------------------------------------*/

//////////////////////////////////////////////////////////////////////////
// $Id: Graph.h,v 1.1 2009/04/03 12:46:10 sunjun Exp $
//////////////////////////////////////////////////////////////////////////

#ifndef __Graph__
#define __Graph__

//////////////////////////////////////////////////////////////////////////

#if defined __cplusplus

//////////////////////////////////////////////////////////////////////////

#include <MThread.h>
#include <MMutex.h>
#include <Context.h>
#include <Operation.h>

//////////////////////////////////////////////////////////////////////////

NAMESPACE_BEGIN

//////////////////////////////////////////////////////////////////////////

	typedef MPtr<class Graph>GraphPtr;

	//////////////////////////////////////////////////////////////////////////

	// this class provides an object-oriented graph interface.
	class API Graph : public Context, private virtual MThread
	{
	public:
		// constructor
		Graph();

		// destructor
		virtual ~Graph();

		// bind a window handle
		INLINE VOID bind( HWND wnd );

		// exec a operation to the graph
		INLINE VOID exec( const class Operation * op );

		// swap the back buffer of the graph
		INLINE VOID swap();

	private:
		// the graph's run method.
		INLINE VOID run();

	private:
		// the operation table of the graph 
		MMutex mOptsMutex;
		std::vector<OperationPtr>*mOpts[2];
	};

//////////////////////////////////////////////////////////////////////////

NAMESPACE_END

//////////////////////////////////////////////////////////////////////////

#endif // __cplusplus

//////////////////////////////////////////////////////////////////////////

#endif // __Graph__

//////////////////////////////////////////////////////////////////////////